// import type { Router, RouteRecordNormalized } from 'vue-router';
import NProgress from "nprogress"; // progress bar

import usePermission from "@/hooks/permission";
import { useAppStore, useUserStore } from "@/store";
import { NOT_FOUND, WHITE_LIST } from "../constants";
import { appRoutes } from "../routes";

export default function setupPermissionGuard(router) {
	router.beforeEach(async (to, from, next) => {
		const appStore = useAppStore();
		const userStore = useUserStore();
		const Permission = usePermission();
		const permissionsAllow = Permission.accessRouter(to);
		if (appStore.menuFromServer) {
			// 针对来自服务端的菜单配置进行处理
			// Handle routing configuration from the server

			// 根据需要自行完善来源于服务端的菜单配置的permission逻辑
			// Refine the permission logic from the server's menu configuration as needed
			if (!appStore.appAsyncMenus.length && !WHITE_LIST.find((el) => el.name === to.name)) {
				await appStore.fetchServerMenuConfig();
			}
			const serverMenuConfig = [...appStore.appAsyncMenus, ...WHITE_LIST];

			let exist = false;
			while (serverMenuConfig.length && !exist) {
				const element = serverMenuConfig.shift();
				if (element?.name === to.name) exist = true;

				if (element?.children) {
					serverMenuConfig.push(...element.children);
				}
			}
			if (exist && permissionsAllow) {
				next();
			} else next(NOT_FOUND);
		} else {
			// eslint-disable-next-line no-lonely-if
			if (permissionsAllow) next();
			else {
				const destination = Permission.findFirstPermissionRoute(appRoutes, userStore.role) || NOT_FOUND;
				next(destination);
			}
		}
		NProgress.done();
	});
}
